package com.jzo2o.customer.util;

import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class TokenHelper {
    // 生成管理员令牌
    public static String generateTokenOfAdmin(String appId, 
                                             String accessKeyId, 
                                             String accessKeySecret, 
                                             Object currentUser) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("appId", appId);
        claims.put("userId", getUserId(currentUser));
        claims.put("userType", "ADMIN");
        claims.put("roles", new String[]{"ADMIN", "SUPER_USER"});
        claims.put("permissions", new String[]{"*:*"});
        
        return generateToken(accessKeyId, accessKeySecret, claims);
    }

    // 生成普通用户令牌
    public static String generateTokenOfUser(String appId, 
                                            String accessKeyId, 
                                            String accessKeySecret, 
                                            Object currentUser) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("appId", appId);
        claims.put("userId", getUserId(currentUser));
        claims.put("userType", "USER");
        claims.put("roles", new String[]{"USER"});
        claims.put("permissions", new String[]{"read:*", "write:self"});
        
        return generateToken(accessKeyId, accessKeySecret, claims);
    }

    // 实际令牌生成方法（简化的Base64编码）
    private static String generateToken(String accessKeyId, 
                                       String accessKeySecret, 
                                       Map<String, Object> claims) {
        // 添加密钥信息到声明
        claims.put("keyId", accessKeyId);
        claims.put("keyHash", Integer.toHexString(accessKeySecret.hashCode()));
        
        // 添加时间戳
        claims.put("iat", System.currentTimeMillis());
        claims.put("exp", System.currentTimeMillis() + 3600000); // 1小时有效期
        
        // 将声明转换为字符串
        String claimsJson = mapToJson(claims);
        
        // 简化的Base64编码（实际应用中应使用JWT等签名机制）
        return Base64.getEncoder().encodeToString(claimsJson.getBytes());
    }

    // 从用户对象获取用户ID（根据你的对象结构调整）
    private static String getUserId(Object currentUser) {
        // 实际实现应根据你的UserInfo对象结构
        // 这里只是一个示例
        try {
            // 假设UserInfo有getId()方法
            return (String) currentUser.getClass().getMethod("getId").invoke(currentUser);
        } catch (Exception e) {
            return "unknown-user";
        }
    }

    // 将Map转换为JSON字符串（简化实现）
    private static String mapToJson(Map<String, Object> map) {
        StringBuilder json = new StringBuilder("{");
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            json.append("\"").append(entry.getKey()).append("\":");
            
            if (entry.getValue() instanceof String) {
                json.append("\"").append(entry.getValue()).append("\"");
            } else if (entry.getValue() instanceof Object[]) {
                Object[] array = (Object[]) entry.getValue();
                json.append("[");
                for (int i = 0; i < array.length; i++) {
                    json.append("\"").append(array[i]).append("\"");
                    if (i < array.length - 1) json.append(",");
                }
                json.append("]");
            } else {
                json.append(entry.getValue());
            }
            
            json.append(",");
        }
        // 删除最后一个逗号
        if (map.size() > 0) json.deleteCharAt(json.length() - 1);
        json.append("}");
        
        return json.toString();
    }

    // 验证令牌（可选）
    public static boolean verifyToken(String token, String accessKeySecret) {
        try {
            String decoded = new String(Base64.getDecoder().decode(token));
            // 这里应该检查签名和有效期
            return decoded.contains("\"keyHash\":\"" + Integer.toHexString(accessKeySecret.hashCode()) + "\"");
        } catch (Exception e) {
            return false;
        }
    }
}